﻿using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using MindFusion.Diagramming;

namespace Inference
{
    public delegate List<TreeNode> GetTargetsMethod(TreeNode current);
    public delegate List<TreeViewNode> ConvertTargetsMethod(List<TreeNode> ltn);

    public class Highlighter
    {
        public Highlighter(
            TargetNodesGroups TargetNodesGroup,
            Color HighlightColor,
            Color ClearColor,
            MindFusion.Drawing.Brush DiagramClearBrush,
			string Description,
            bool Enabled,
            GetTargetsMethod gtmDelegate,
            ConvertTargetsMethod ctmDelegate)
        {
			this.Description = Description;
            this.TargetNodesGroup = TargetNodesGroup;
            this.HighlightColor = HighlightColor;
            this.ClearColor = ClearColor;
            this.DiagramClearBrush = DiagramClearBrush;
            this.Enabled = Enabled;
            this.GetTreeNodeHighlightTargets = gtmDelegate;
            this.GetDiagramNodesHighlightTargets = ctmDelegate;
        }

		public string Description
		{
			get;
			set;
		}

        public TargetNodesGroups TargetNodesGroup
        {
            get;
            set;
        }

        public Color HighlightColor
        {
            get;
            set;
        }

        public Color ClearColor
        {
            get;
            set;
        }

        public MindFusion.Drawing.Brush DiagramClearBrush
        {
            get;
            set;
        }

        public bool Enabled
        {
            get;
            set;
        }

        public ConvertTargetsMethod GetDiagramNodesHighlightTargets
        {
            get;
            set;
        }

        public GetTargetsMethod GetTreeNodeHighlightTargets
        {
            get;
            set;
        }

		public ToolStripButton ControlButton
		{
			get;
			set;
		}

        public void Apply(TreeNode current)
        {
            List<TreeNode> ltn = GetTreeNodeHighlightTargets.Invoke(current);
            foreach (var tn in ltn)
            {
                tn.BackColor = HighlightColor;
            }
            foreach (var dn in GetDiagramNodesHighlightTargets.Invoke(ltn))
            {
                dn.Pen = new MindFusion.Drawing.Pen(HighlightColor, 1);
            }

        }
        public void Clear(TreeNode current)
        {
            List<TreeNode> ltn = GetTreeNodeHighlightTargets.Invoke(current);
            foreach (var tn in ltn)
            {
                tn.BackColor = ClearColor;
            }
            foreach (var dn in GetDiagramNodesHighlightTargets.Invoke(ltn))
            {
                dn.Pen = new MindFusion.Drawing.Pen(DiagramClearBrush, 1);
                dn.Pen = new MindFusion.Drawing.Pen(System.Drawing.Color.Black, (float)0.2);
            }
        }

        public ToolStripButton CreateControlButton(System.EventHandler clickHandler)
        {
            ToolStripButton res = new ToolStripButton();
            switch (TargetNodesGroup)
            {
                case TargetNodesGroups.Brothers:
                    res.Text = "Братья";
                    res.ToolTipText = "Фреймы, имеющие общего родителя с выбранным фреймом";
                    break;
                case TargetNodesGroups.Parent:
                    res.Text = "Родитель";
                    res.ToolTipText = "Фрейм-родитель";
                    break;
                case TargetNodesGroups.Children:
                    res.Text = "Потомки";
                    res.ToolTipText = "Фреймы, для которыз выбранный фрейм является родителем";
                    break;
                case TargetNodesGroups.Next:
                    res.Text = "Следующий";
                    res.ToolTipText = "Фрейм, указанный в слоте Next";
                    break;
                case TargetNodesGroups.Previous:
                    res.Text = "Предыдущий";
                    res.ToolTipText = "Фрейм, в слоте Next которого указан выбранный фрейм";
                    break;
                case TargetNodesGroups.Sub:
                    res.Text = "Субфреймы";
                    res.ToolTipText = "Фреймы, являющиеся субфреймами выбранного фрейма";
                    break;
                case TargetNodesGroups.SubUser:
                    res.Text = "Польз.субфрейма";
                    res.ToolTipText = "Фреймы, субфреймом которых является выбранный фрейм";
                    break;
                case TargetNodesGroups.Domains:
                    res.Text = "Домены";
                    res.ToolTipText = "Домены, к которым относятся слоты выбранного фрейма";
                    break;
                case TargetNodesGroups.DomainUsers:
                    res.Text = "Польз.домена";
                    res.ToolTipText = "Фреймы, некоторые слоты которых относятся к выбранному домену";
                    break;
                default:
                    break;
            }
            res.AutoSize = true;
            res.CheckOnClick = true;
            res.Checked = Enabled;
            res.Click += new System.EventHandler(res_Click);
            res.Click += clickHandler;
            res.ForeColor = HighlightColor;
			ControlButton = res;
            return res;
        }

		public void RefreshControlButton()
		{
			if (ControlButton != null)
			{
				ControlButton.ForeColor = HighlightColor;
				ControlButton.Checked = Enabled;

			}
		}

        void res_Click(object sender, System.EventArgs e)
        {
            Enabled = (((ToolStripButton)sender).Checked);
        }

    }
}
